﻿using System.Text.RegularExpressions;
using Zo.Collections;

namespace Zo.Extensions
{
    /// <summary>
    /// URL 字符串扩展。
    /// </summary>
    public static class UrlExtensions
    {
        /// <summary>
        /// 验证 Web URL 的正则表达式。
        /// </summary>
        private static readonly Regex _webUrlExpression = new Regex(@"(http|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", RegexOptions.Singleline | RegexOptions.Compiled);

        /// <summary>
        /// 是否 URL。
        /// </summary>
        /// <param name="target">当前字符串。</param>
        /// <returns>是否 URL。</returns>
        public static bool IsUrl(this string target)
        {
            return !string.IsNullOrWhiteSpace(target) && _webUrlExpression.IsMatch(target);
        }

        /// <summary>
        /// 将 URL 参数转换成字典形式（KEY会自动转换成小写字母的形式）。
        /// </summary>
        /// <remarks>
        /// 例：
        /// ?userId=1
        /// =>
        /// key:userId
        /// value:1
        /// 1.其中，“?”可要可不要。
        /// 2.key 是以小写字母的形式。
        /// </remarks>
        /// <param name="source">URL 参数。</param>
        /// <returns></returns>
        public static UrlDictionary GetUrlParameterByString(this string source)
        {
            var parameters = new UrlDictionary();

            if (!string.IsNullOrWhiteSpace(source))
            {
                var dataArray = source.TrimStart('?').Trim('&').Split('&');

                if (dataArray.Length > 0)
                {
                    foreach (var item in dataArray)
                    {
                        if (!string.IsNullOrWhiteSpace(item))
                        {
                            var itemArray = item.Split('=');

                            if (itemArray.Length == 2)
                            {
                                var key = itemArray[0] ?? string.Empty;
                                var value = itemArray[1] ?? string.Empty;

                                if (!string.IsNullOrWhiteSpace(key))
                                {
                                    if (!parameters.ContainsKey(key))
                                        parameters.Add(key, value);
                                }
                            }
                        }
                    }
                }
            }

            return parameters;
        }

        /// <summary>
        /// 组装 URL。
        /// </summary>
        /// <param name="source">当前域名。</param>
        /// <param name="path">相对路径 URL。</param>
        /// <returns></returns>
        public static string CombineUrl(this string source, string path)
        {
            source = source ?? string.Empty;
            path = path ?? string.Empty;
            return source.TrimEnd('/') + "/" + path.TrimStart('/');
        }
    }
}